AWS CDK で、Kinesis Data streams をターゲットとした EventBridge Rules に DLQ を簡単に設定可能になりました

AWS CDK で、Kinesis Data streams をターゲットとした EventBridge Rules に DLQ を簡単に設定可能になりました

Clock Icon2024.09.24

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の最新のリリースで、下記のアップデートが追加されていました。

https://github.com/aws/aws-cdk/releases/tag/v2.159.0

events-target: support Dead Letter Queue for Kinesis Stream Event Target (#31435) (358f231), closes #31428 #13600

Amazon EventBridge のルールには、ターゲットへの配信が失敗した際のメッセージ送信先として Dead Letter Queue (DLQ) を設定できます。

https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rule-dlq.html

AWS CDK でターゲットを構成した場合に、今までは下記をターゲットにした場合のみ L2 Construct で DLQ を設定できていました。

  • Codebuild
  • CodePipeline
  • Lambda
  • StepFunctions
  • LogGroup
  • SQSQueue
  • SNSTopic
  • ECSTask

それが今回の AWS CDK のアップデートにより、上記に加えて Kinesis Data streams をターゲットとしている場合にも DLQ を L2 Construct で簡単に設定できるようになりました。

試してみた

ターゲットに DLQ を設定しない場合

まずは DLQ を設定しない場合を確認してみます。

次のように Kinesis Data streams をターゲットとして Event Rule を構成する CDK コードを作成します。ここでは DLQ は設定しません。

lib/cdk-sample-stack.ts
import * as events from 'aws-cdk-lib/aws-events';
import * as event_targets from 'aws-cdk-lib/aws-events-targets';
import * as kinesis from 'aws-cdk-lib/aws-kinesis';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    const myKinesisStream = new kinesis.Stream(this, 'MyKinesisStream');

    const everyMinuteEventRule = new events.Rule(this, 'EveryMinuteEventRule', {
      schedule: events.Schedule.rate(cdk.Duration.minutes(1)),
    });

    everyMinuteEventRule.addTarget(
      new event_targets.KinesisStream(myKinesisStream)
      // DLQ を設定しない
    );
  }
}

上記をデプロイ後、ダッシュボードから Event Rule を確認すると、当然ながら DLQ は設定されていません。

CDK パッケージのアップデート

AWS CDK モジュールを v2.159.0 以上にアップデートします。

npm i aws-cdk-lib@latest aws-cdk@latest

ターゲットに DLQ を設定する

次に DLQ を設定した場合を確認してみます。

先ほどと同様に Kinesis Data streams をターゲットとして Event Rule を構成する CDK コードを作成しますが、今回は event_targets.KinesisStream クラスで利用可能となった deadLetterQueue プロパティに SQS キューを指定しています。

lib/cdk-sample-stack.ts
import * as events from 'aws-cdk-lib/aws-events';
import * as event_targets from 'aws-cdk-lib/aws-events-targets';
import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as kinesis from 'aws-cdk-lib/aws-kinesis';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    const myKinesisStream = new kinesis.Stream(this, 'MyKinesisStream');

    const myQueue = new sqs.Queue(this, 'MyQueue');

    const everyMinuteEventRule = new events.Rule(this, 'EveryMinuteEventRule', {
      schedule: events.Schedule.rate(cdk.Duration.minutes(1)),
    });

    everyMinuteEventRule.addTarget(
      new event_targets.KinesisStream(myKinesisStream, {
        deadLetterQueue: myQueue, // DLQ を設定
      })
    );
  }
}

Git diff で CDK コードの差分を確認した様子です。

$ git diff lib/cdk-sample-stack.ts
diff --git a/lib/cdk-sample-stack.ts b/lib/cdk-sample-stack.ts
index 405c420..24bb7d1 100644
--- a/lib/cdk-sample-stack.ts
+++ b/lib/cdk-sample-stack.ts
@@ -1,5 +1,6 @@
 import * as events from 'aws-cdk-lib/aws-events';
 import * as event_targets from 'aws-cdk-lib/aws-events-targets';
+import * as sqs from 'aws-cdk-lib/aws-sqs';
 import * as kinesis from 'aws-cdk-lib/aws-kinesis';
 import * as cdk from 'aws-cdk-lib';
 import { Construct } from 'constructs';
@@ -10,12 +11,16 @@ export class CdkSampleStack extends cdk.Stack {

     const myKinesisStream = new kinesis.Stream(this, 'MyKinesisStream');

+    const myQueue = new sqs.Queue(this, 'MyQueue');
+
     const everyMinuteEventRule = new events.Rule(this, 'EveryMinuteEventRule', {
       schedule: events.Schedule.rate(cdk.Duration.minutes(1)),
     });

     everyMinuteEventRule.addTarget(
-      new event_targets.KinesisStream(myKinesisStream)
+      new event_targets.KinesisStream(myKinesisStream, {
+        deadLetterQueue: myQueue,
+      })
     );
   }
 }

CDK Diff を確認すると、作成された SQS キューが Event Rule の DeadLetterConfig に設定されています。

$ npx cdk diff
Stack CdkSampleStack
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Resources
[+] AWS::SQS::Queue MyQueue MyQueueE6CA6235
[~] AWS::Events::Rule EveryMinuteEventRule EveryMinuteEventRule061EE897
 └─ [~] Targets
     └─ @@ -6,6 +6,14 @@
        [ ]     "Arn"
        [ ]   ]
        [ ] },
        [+] "DeadLetterConfig": {
        [+]   "Arn": {
        [+]     "Fn::GetAtt": [
        [+]       "MyQueueE6CA6235",
        [+]       "Arn"
        [+]     ]
        [+]   }
        [+] },
        [ ] "Id": "Target0",
        [ ] "RoleArn": {
        [ ]   "Fn::GetAtt": [

✨  Number of stacks with differences: 1

CDK デプロイ後、ダッシュボードから Event Rule を確認すると、DLQ が設定されていることを確認できました。

おわりに

AWS CDK で、Kinesis Data streams をターゲットとした EventBridge Rules に DLQ を簡単に設定可能になっていたのでご紹介しました。

DLQ を設定することで、ターゲットへの配信が失敗した際にもメッセージを喪失せずに保持したり、後から再処理させたりすることができます。その設定がエスケープハッチを使わずに L2 Construct で簡単にできるようになったのは嬉しいですね。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.